//#include <iostream>
//using namespace std;
//
/////*
////operator new：该函数实际通过malloc来申请空间，当malloc申请空间成功时直接返回；申请空间
////失败，尝试执行空        间不足应对措施，如果改应对措施用户设置了，则继续申请，否
////则抛异常。
////*/
////void* __CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
////{
////	// try to allocate size bytes
////	void* p;
////	while ((p = malloc(size)) == 0)
////		if (_callnewh(size) == 0)
////		{
////			// report no memory
////			// 如果申请内存失败了，这里会抛出bad_alloc 类型异常
////			static const std::bad_alloc nomem;
////			_RAISE(nomem);
////		}
////	return (p);
////}
/////*
////operator delete: 该函数最终是通过free来释放空间的
////*/
////void operator delete(void* pUserData)
////{
////	_CrtMemBlockHeader* pHead;
////	RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));
////	if (pUserData == NULL)
////		return;
////	_mlock(_HEAP_LOCK);  /* block other threads */
////	__TRY
////		    /* get a pointer to memory block header */
////		pHead = pHdr(pUserData);
////	     /* verify block type */
////	_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
////	_free_dbg(pUserData, pHead->nBlockUse);
////	__FINALLY
////		_munlock(_HEAP_LOCK);  /* release other threads */
////	__END_TRY_FINALLY
////		return;
////}
/////*
////free的实现
////*/
////#define  free(p)        _free_dbg(p, _NORMAL_BLOCK)
//
//
//class A
//{
//public:
//	A(int a = 0)
//		: _a(a)
//	{
//		//cout << "A():" << this << endl;
//		cout << "A():" << endl;
//
//	}
//	A(int a1, int a2)
//	{
//		cout << "A(int a1, int a2)" << endl;
//	}
//	
//	A(const A& aa)
//		: _a(aa._a)
//	{
//		cout << "A(const A& aa)" << endl;
//	}
//	A& operator=(const A& aa)
//	{
//		cout << "A& operator=(const A& aa)" << endl;
//		if (this != &aa)
//		{
//			_a = aa._a;
//		}
//		return *this;
//	}
//
//	~A()
//	{
//		//cout << "~A()" << this << endl;
//		cout << "~A()" << endl;
//
//	}
//private:
//	int _a;
//};
//
//
//int main()
//{
//	// operator new->(malloc) + 构造函数
//	A* p2 = new A;
//	
//	// 析构 + operator delete
//	delete p2;
//
//	return 0;
//}




#include <iostream>
using namespace std;
class A
{
public:
	A(int a = 0)
		: _a(a)
	{
		cout << "A():" << this << endl;
	}
	~A()
	{
		cout << "~A()" << this << endl;
	}
private:
	int _a;
};


// 结论： 不要错配使用，一定要匹配使用，否则结果是不确定
int main()

{
	//A* p1 = new A;
	
	A* p2 = new A[10]; //显示写析构 则是44个字节，不然就是40个字节
	//多开4字节存储对象个数，方便delete[]，知道它有多少个对象，要调用多少次析构
	//free(p2); //sizeof = 44 / 40；
	delete[]p2; // 用这个就对了
	//delete p2;

	// 上下交错使用，没有问题
	
	int* p3 = new int[10]; //40
	free(p3);

	return 0;
}
